<?php
/**
 * crcl/base
 *
 * Copyright 2013 CRCL - André Sabosch - info@crcl.de
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

namespace crcl\base\database\query;

interface ISelect
{
  public function setTable($sTable);

  public function getTables();

  public function setColumns(); //dynmic args
  public function setColumnsFromArray($aColumns);

  public function setColumn($sColumn);

  public function getColumns();

  public function setDistinct($bDistinct = \TRUE);

  public function isDistinct();

  public function setWhere($sWhere, $aValues = array());

  public function addWhere($sWhere, $aValues = array(), $sOperator = 'AND');

  public function getWhere();

  public function setOrderby($sColumn, $sDirection = \NULL);

  public function addOrderby($sColumn, $sDirection = \NULL);

  public function getOrderby();

  public function setJoin($sTable, $sType = 'inner');

  public function setOn($sLeft, $sRight, $sOperator = '=');

  public function setOnCondition($sCondition);

  public function getJoin();

  public function setLimit($iCount);

  /* trait group */
  public function setGroupby($sColumn);
  public function getGroupby();
}

class ContainerSelect extends Concrete implements ISelect
{
  use
    traits\Distinct,
    traits\Column,
    traits\Table,
    traits\Join,
    traits\Where,
    traits\Orderby,
    traits\Groupby,
    traits\Limit;
}